﻿/**
 * Copyright "Nobz"
 * "contributeur : G. Qyy"
 * (06/2010) 
 * 
 * alienscorp9@gmail.com
 * 
 * Ce logiciel est un programme informatique servant à démontrer l'usage des différentes possibilité de C#. 
 * 
 * Ce logiciel est régi par la licence CeCILL-B soumise au droit français et
 * respectant les principes de diffusion des logiciels libres. Vous pouvez
 * utiliser, modifier et/ou redistribuer ce programme sous les conditions
 * de la licence CeCILL-B telle que diffusée par le CEA, le CNRS et l'INRIA 
 * sur le site "http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt".
 * 
 * En contrepartie de l'accessibilité au code source et des droits de copie,
 * de modification et de redistribution accordés par cette licence, il n'est
 * offert aux utilisateurs qu'une garantie limitée.  Pour les mêmes raisons,
 * seule une responsabilité restreinte pèse sur l'auteur du programme,  le
 * titulaire des droits patrimoniaux et les concédants successifs.
 * 
 * A cet égard  l'attention de l'utilisateur est attirée sur les risques
 * associés au chargement,  à l'utilisation,  à la modification et/ou au
 * développement et à la reproduction du logiciel par l'utilisateur étant 
 * donné sa spécificité de logiciel libre, qui peut le rendre complexe à 
 * manipuler et qui le réserve donc à des développeurs et des professionnels
 * avertis possédant  des  connaissances  informatiques approfondies.  Les
 * utilisateurs sont donc invités à charger  et  tester  l'adéquation  du
 * logiciel à leurs besoins dans des conditions permettant d'assurer la
 * sécurité de leurs systèmes et ou de leurs données et, plus généralement, 
 * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. 
 * 
 * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez 
 * pris connaissance de la licence CeCILL-B, et que vous en avez accepté les
 * termes.
 **/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace GestionComptes.Class
{
    [Serializable]
    public class Ecriture
    {
        // DOC: enum - http://msdn.microsoft.com/fr-fr/library/sbbt4032.aspx
        // DOC: Enum - http://msdn.microsoft.com/fr-fr/library/system.enum.aspx
        public enum TypesEcritureEnum {Credit, Debit};

        public enum NatureOperationEnum { Cheque, CB, Retrait, Virement, Prelevement, Autre };

        public Ecriture()
        {
        }

        public Ecriture(DateTime dateEcriture, Double valeurEcriture)
        {
            if (Math.Sign(valeurEcriture) == 0)
            {
                throw new ArgumentException("La valeur de l'écriture ne doit pas être égale à 0.");
            }

            this.DateEcriture = dateEcriture;
            this.ValeurEcriture = valeurEcriture;
        }

        public Ecriture(DateTime dateEcriture, Double valeurEcriture, NatureOperationEnum natureOperation)
        {
            if (Math.Sign(valeurEcriture) == 0)
            {
                throw new ArgumentException("La valeur de l'écriture ne doit pas être égale à 0.");
            }

            this.DateEcriture = dateEcriture;
            this.ValeurEcriture = valeurEcriture;
            this.NatureOperation = natureOperation;
        }

        public Ecriture(DateTime dateEcriture, Double valeurEcriture, NatureOperationEnum natureOperation, String libelleEcriture)
        {
            if (Math.Sign(valeurEcriture) == 0)
            {
                throw new ArgumentException("La valeur de l'écriture ne doit pas être égale à 0.");
            }

            this.DateEcriture = dateEcriture;
            this.ValeurEcriture = valeurEcriture;
            this.NatureOperation = natureOperation;
            this.LibelleEcriture = libelleEcriture;
        }


        #region Explication sur les modificateurs d'accès (public - private - protected ...)
        // DOC: Modificateurs d'accès - http://msdn.microsoft.com/fr-fr/library/wxh6fsc7.aspx
        //
        // ATTENTION : explication simplifié pas forcément très juste. Lire le lien ci-dessus !
        //
        // virtual : la class peut être redéfinit dans les class qui en hérite
        // avec override, mais un comportement par défaut est disponible dans la class mère
        // 
        // abstract : la class mère ne définit pas de comportement mais impose d'implémenter le
        // membre avec le comportement que l'on veux
        //
        // un membre sans virtual ni abstract sera imposé dans les classe fille mais uniquement si
        // il est de type public ou protected.
        //
        // un membre private ne sera pas hérité, et sa portée se limite à la classe dans laquelle il est déclaré
        // un membre protected sera hérité dans les classes fille
        // un membre public sera disponnible depuis l'exterieur de la class
        #endregion

        #region Explication Méthode - Paramètres - Propriétés...
        // DOC : Propriétés - http://msdn.microsoft.com/fr-fr/library/x9fsa0sw.aspx
        // DOC : Utilisation de propriétés - http://msdn.microsoft.com/fr-fr/library/w86s7x04.aspx
        // 
        // La methode est une sorte de "fonction" qui permet d'executer des actions en fonctions des
        // paramètres qu'on lui aura passé
        //  
        // Un paramètre est un information que l'on passe à une méthode pour lui donner les informations
        // nécéssaire à son exécution
        // 
        // Exemple : [modificateur d'acces] public [type de retour] void [nom de la méthode] MaMethode([type du paramètre] String [nom du paramètre] monParam) {}
        // 
        // Une propriété est un membre qui permet d'accéder à un champs privé de manière controlé
        // voire être simplement un membre de donnée public. (c.f. : doc sur l'utilisation des propriétés)
        // C'est en quelque sorte l'équivalent de l'attribut Java, mais l'attribut a un autre sens en C#

        #endregion

        #region Explication ComponentModel - Attributs
        // DOC: ComponentModel - http://msdn.microsoft.com/fr-fr/library/system.componentmodel.aspx
        // DOC: Attributs - http://msdn.microsoft.com/fr-fr/library/z0w1kczw.aspx
        // DOC: Attributs courants - http://msdn.microsoft.com/fr-fr/library/z371wyft.aspx
        // 
        // En C# l'attribut est fournit une méthode pour associer des information de déclaration à une entité
        // (comme un membre, un type...), et sera utilisé au moment de l'execution au
        // travers de la réflexion.
        //
        // Le ComponentModel fournit des class pour implémenter des comportement aux composants à travers
        // l'usage d'attributs
        #endregion

        #region Explication sur la Réflexion
        // DOC : Réflexion C# - http://msdn.microsoft.com/fr-fr/library/ms173183.aspx
        // DOC : Réflexion Wikipédia - http://fr.wikipedia.org/wiki/R%C3%A9flexion_(informatique)
        // 
        // La réflexion est la capacité qu'a un programme d'explorer ses propres structures commes
        // les membres d'un objet, par exemple, lors de son exécution.
        #endregion

        #region Propriétés

        /// <summary>
        /// Type de l'écriture à comparer à l'aide de l'énumérateur Ecriture.TypesEcriture
        /// </summary>
        [Category("Colonne "), Description("Type de l'écriture"), DisplayNameAttribute("Type"), ReadOnly(true)]
        public TypesEcritureEnum TypeEcriture
        {
            get
            {
                // DOC: Math.Sign - http://msdn.microsoft.com/en-us/library/ywb0xks3.aspx
                if (Math.Sign(ValeurEcriture) == -1)
                {
                    return TypesEcritureEnum.Debit;
                }
                else if (Math.Sign(ValeurEcriture) == +1)
                {
                    return TypesEcritureEnum.Credit;
                }
                else
                {
                    throw new ArgumentException("La valeur de l'écriture est égale à 0");
                }
            }
        }

        /// <summary>
        /// Date de l'écriture
        /// </summary>
        [Category("Colonne "), Description("Date de l'écriture"), DisplayNameAttribute("Date")]
        public virtual DateTime DateEcriture
        {
            get;
            set;
        }

        /// <summary>
        /// Valeur de l'écriture
        /// </summary>
        [Category("Colonne"), Description("Valeur de l'écriture"), DisplayNameAttribute("Valeur")]
        public virtual Double ValeurEcriture
        {
            get;
            set;
        }

        /// <summary>
        /// Nature de l'opération
        /// </summary>
        [Category("Colonne"), Description("Nature de l'opération"), DisplayNameAttribute("Opération")]
        public virtual NatureOperationEnum NatureOperation
        {
            get;
            set;
        }

        /// <summary>
        /// Libéllé de l'écriture
        /// </summary>
        [Category("Colonne"), Description("Libéllé de l'écriture"), DisplayNameAttribute("Libéllé")]
        public virtual String LibelleEcriture
        {
            get;
            set;
        }

        #endregion

        #region Methodes


        #endregion

    }
}